#include "mainwindow.h"
#include "dieselgenerator.h"
#include "photovoltaic.h"
#include "energystorage.h"
#include "load.h"
#include "maingrid.h"
#include <QDebug>
#include <QApplication>
#include <QVector>
#include <microgridmanager.h>
void testComponentInheritance();
void testDieselGenerator();
void testPhotovoltaic();
void testEnergyStorage();
void testLoad();
void testMainGrid();
void testMicrogridManager();
void testAllComponents();
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << "=== 开始微电网能源管理系统组件测试 ===";

    // 运行各个组件的测试
    qDebug() << "\n1. 组件继承关系测试...";
    testComponentInheritance();

    qDebug() << "\n2. 柴油发电机测试...";
    testDieselGenerator();

    qDebug() << "\n3. 光伏发电测试...";
    testPhotovoltaic();

    qDebug() << "\n4. 储能系统测试...";
    testEnergyStorage();

    qDebug() << "\n5. 负载测试...";
    testLoad();

    qDebug() << "\n6. 主电网测试...";
    testMainGrid();
    qDebug() << "\n7. 微电网管理器测试...";
    testMicrogridManager();

    qDebug() << "\n8. 所有组件集成测试...";
    testAllComponents();

    qDebug() << "\n=== 所有测试完成，启动主界面... ===";



    MainWindow w;
    w.show();
    return a.exec();
}

void testComponentInheritance()
{
    qDebug() << "--- 组件继承关系测试 ---";

    // 测试1: 创建DieselGenerator对象并测试继承的方法
    DieselGenerator diesel("测试柴油发电机", 800, 100, 0.6);

    // 测试基类方法
    qDebug() << "组件名称:" << diesel.getName();
    qDebug() << "初始功率:" << diesel.getPower() << "kW";
    qDebug() << "初始激活状态:" << (diesel.getIsActive() ? "激活" : "未激活");

    // 测试派生类特有方法
    qDebug() << "最大功率:" << diesel.getMaxPower() << "kW";
    qDebug() << "最小功率:" << diesel.getMinPower() << "kW";
    qDebug() << "燃料成本:" << diesel.getFuelCost() << "元/kWh";

    // 测试方法重写
    diesel.setPower(500);
    qDebug() << "设置功率后:" << diesel.getPower() << "kW";

    // 测试功率范围限制
    diesel.setPower(1000); // 超过最大功率
    qDebug() << "超过最大功率限制后:" << diesel.getPower() << "kW";

    diesel.setPower(50); // 低于最小功率
    qDebug() << "低于最小功率限制后:" << diesel.getPower() << "kW";

    qDebug() << "状态信息:\n" << diesel.getStatus();

    qDebug() << "√ 组件继承关系测试通过";
}

// 测试柴油发电机特定功能
void testDieselGenerator()
{
    qDebug() << "--- 柴油发电机功能测试 ---";

    DieselGenerator diesel("柴油发电机测试", 1000, 200, 0.55);

    // 测试启动和停止
    qDebug() << "启动前状态:" << (diesel.getIsActive() ? "运行中" : "停止");
    diesel.start();
    qDebug() << "启动后状态:" << (diesel.getIsActive() ? "运行中" : "停止");
    qDebug() << "启动后功率:" << diesel.getPower() << "kW";

    diesel.stop();
    qDebug() << "停止后状态:" << (diesel.getIsActive() ? "运行中" : "停止");
    qDebug() << "停止后功率:" << diesel.getPower() << "kW";

    // 测试成本计算
    diesel.setPower(600);
    qDebug() << "功率600kW时的运行成本:" << diesel.calculateCost() << "元/小时";

    // 测试功率范围设置
    diesel.setPowerRange(300, 800);
    qDebug() << "设置新功率范围后 - 最小:" << diesel.getMinPower() << "kW, 最大:" << diesel.getMaxPower() << "kW";

    diesel.setPower(1000); // 超过新最大功率
    qDebug() << "超过新最大功率限制后:" << diesel.getPower() << "kW";

    qDebug() << "√ 柴油发电机功能测试通过";
}

// 测试光伏发电系统
void testPhotovoltaic()
{
    qDebug() << "--- 光伏发电系统测试 ---";

    Photovoltaic pv("测试光伏阵列", 500);

    // 测试基本属性
    qDebug() << "最大容量:" << pv.getMaxCapacity() << "kW";
    qDebug() << "初始功率:" << pv.getPower() << "kW";

    // 测试环境参数设置
    pv.setIrradiation(850);
    pv.setTemperature(28);
    qDebug() << "光照强度:" << pv.getIrradiation() << "W/m²";
    qDebug() << "温度:" << pv.getTemperature() << "°C";

    // 测试功率更新
    pv.updatePower(30); // 假设是第30个时间点（7:30）
    qDebug() << "更新后功率:" << pv.getPower() << "kW";

    // 测试理论最大功率计算
    qDebug() << "理论最大功率:" << pv.calculateTheoreticalMax() << "kW";

    qDebug() << "状态信息:\n" << pv.getStatus();

    qDebug() << "√ 光伏发电系统测试通过";
}

// 测试储能系统
void testEnergyStorage()
{
    qDebug() << "--- 储能系统测试 ---";

    EnergyStorage battery("测试锂电池储能", 2000, 400, 400);

    // 测试基本属性
    qDebug() << "总容量:" << battery.getCapacity() << "kWh";
    qDebug() << "当前储能:" << battery.getCurrentEnergy() << "kWh";
    qDebug() << "SOC:" << battery.getSOC() << "%";

    // 测试充放电
    battery.charge(300, 1); // 以300kW充电1小时
    qDebug() << "充电后储能:" << battery.getCurrentEnergy() << "kWh";
    qDebug() << "充电后SOC:" << battery.getSOC() << "%";
    qDebug() << "充电功率:" << battery.getPower() << "kW (负值表示充电)";

    battery.discharge(200, 2); // 以200kW放电2小时
    qDebug() << "放电后储能:" << battery.getCurrentEnergy() << "kWh";
    qDebug() << "放电后SOC:" << battery.getSOC() << "%";
    qDebug() << "放电功率:" << battery.getPower() << "kW";

    // 测试SOC设置
    battery.setSOC(80);
    qDebug() << "设置SOC为80%后:" << battery.getSOC() << "%";

    qDebug() << "状态信息:\n" << battery.getStatus();

    qDebug() << "√ 储能系统测试通过";
}

// 测试负载
void testLoad()
{
    qDebug() << "--- 负载测试 ---";

    Load load("测试负载", 300);

    // 测试基本属性
    qDebug() << "初始功率:" << load.getPower() << "kW";
    qDebug() << "功率因数:" << load.getPowerFactor();
    qDebug() << "是否关键负载:" << (load.isCriticalLoad() ? "是" : "否");

    // 测试关键负载设置
    load.setCritical(true);
    qDebug() << "设置为关键负载后:" << (load.isCriticalLoad() ? "是" : "否");

    // 测试负载曲线更新
    QVector<double> newProfile(96, 350); // 创建新的负载曲线
    load.setLoadProfile(newProfile);
    load.updateLoad(10); // 更新到第10个时间点
    qDebug() << "更新负载曲线后功率:" << load.getPower() << "kW";

    qDebug() << "状态信息:\n" << load.getStatus();

    qDebug() << "√ 负载测试通过";
}

// 测试主电网
void testMainGrid()
{
    qDebug() << "--- 主电网测试 ---";

    MainGrid grid("测试主电网连接", 1000, 500);

    // 测试基本属性
    qDebug() << "最大输入功率:" << grid.getMaxImportPower() << "kW";
    qDebug() << "最大输出功率:" << grid.getMaxExportPower() << "kW";
    qDebug() << "电网频率:" << grid.getGridFrequency() << "Hz";

    // 测试功率交换
    grid.setPower(200); // 从电网购电200kW
    qDebug() << "购电200kW后功率:" << grid.getPower() << "kW";
    qDebug() << "当前电价:" << grid.getPriceAtTime(30) << "元/kWh";
    qDebug() << "当前成本:" << grid.calculateCost(30) << "元/小时";

    grid.setPower(-150); // 向电网售电150kW
    qDebug() << "售电150kW后功率:" << grid.getPower() << "kW";
    qDebug() << "当前成本:" << grid.calculateCost(30) << "元/小时 (负值表示收益)";

    // 测试电价曲线
    QVector<double> newPrices(96, 0.6); // 创建新的电价曲线
    grid.setPriceProfile(newPrices);
    qDebug() << "设置新电价曲线后:" << grid.getPriceAtTime(0) << "元/kWh";

    qDebug() << "状态信息:\n" << grid.getStatus();

    qDebug() << "√ 主电网测试通过";
}

// 测试微电网管理器
void testMicrogridManager()
{
    qDebug() << "--- 微电网管理器测试 ---";

    MicrogridManager manager;

    // 测试添加组件
    DieselGenerator* diesel = new DieselGenerator("测试柴油发电机", 1000, 100, 0.5);
    manager.addComponent(diesel);

    Photovoltaic* pv = new Photovoltaic("测试光伏阵列", 800);
    manager.addComponent(pv);

    EnergyStorage* battery = new EnergyStorage("测试储能系统", 2000, 400, 400);
    manager.addComponent(battery);

    Load* load = new Load("测试负载", 300);
    manager.addComponent(load);

    qDebug() << "添加组件后数量:" << manager.getComponentCount();

    // 测试获取组件
    Component* component = manager.getComponent("测试柴油发电机");
    if (component) {
        qDebug() << "找到组件:" << component->getName();
    }

    // 测试仿真控制
    manager.startSimulation();
    qDebug() << "仿真状态:" << (manager.isSimulationRunning() ? "运行中" : "停止");
    qDebug() << "总功率:" << manager.getTotalPower() << "kW";
    qDebug() << "总成本:" << manager.getTotalCost() << "元/小时";

    manager.stopSimulation();
    qDebug() << "停止后仿真状态:" << (manager.isSimulationRunning() ? "运行中" : "停止");

    // 测试移除组件
    if (manager.removeComponent("测试柴油发电机")) {
        qDebug() << "成功移除柴油发电机";
    }
    qDebug() << "移除后组件数量:" << manager.getComponentCount();

    qDebug() << "√ 微电网管理器测试通过";
}

// 测试所有组件集成
void testAllComponents()
{
    qDebug() << "--- 所有组件集成测试 ---";

    // 创建各个组件
    DieselGenerator diesel("主柴油发电机", 1000, 100, 0.5);
    Photovoltaic pv("光伏阵列", 800);
    EnergyStorage battery("锂电池储能", 2000, 400, 400);
    Load load("关键负载", 300);
    MainGrid grid("主电网连接", 1000, 500);

    // 设置组件参数
    pv.setIrradiation(850);
    pv.setTemperature(28);
    battery.setSOC(70);
    load.setCritical(true);
    grid.setPower(200);

    // 模拟一天中的不同时间点
    for (int hour = 0; hour < 24; hour += 6) {
        int timeIndex = hour * 4; // 转换为15分钟间隔的时间索引

        qDebug() << "\n--- 时间:" << hour << ":00 ---";

        // 更新组件状态
        pv.updatePower(timeIndex);
        load.updateLoad(timeIndex);

        // 计算总功率和成本
        double totalPower = diesel.getPower() + pv.getPower() +
                            battery.getPower() + load.getPower() + grid.getPower();

        double totalCost = diesel.calculateCost() + grid.calculateCost(timeIndex);

        qDebug() << "柴油发电:" << diesel.getPower() << "kW, 成本:" << diesel.calculateCost() << "元/小时";
        qDebug() << "光伏发电:" << pv.getPower() << "kW";
        qDebug() << "储能:" << battery.getPower() << "kW, SOC:" << battery.getSOC() << "%";
        qDebug() << "负载:" << load.getPower() << "kW";
        qDebug() << "电网交换:" << grid.getPower() << "kW, 成本:" << grid.calculateCost(timeIndex) << "元/小时";
        qDebug() << "总功率:" << totalPower << "kW, 总成本:" << totalCost << "元/小时";
    }

    qDebug() << "√ 所有组件集成测试通过";
}










